package com.demo.schedule;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class TaskScheduler {
  private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
  private static final TaskScheduler instance = new TaskScheduler();

  private TaskScheduler() {
    // 私有构造器
  }

  public static TaskScheduler getInstance() {
    return instance;
  }

  /**
   * 安排定时任务
   * @param task 要执行的任务
   * @param initialDelay 首次执行延迟时间
   * @param period 执行周期
   * @param unit 时间单位
   * @return 定时任务控制器
   */
  public ScheduledFuture<?> scheduleAtFixedRate(Runnable task,
      long initialDelay,
      long period,
      TimeUnit unit) {
    return scheduler.scheduleAtFixedRate(task, initialDelay, period, unit);
  }

  /**
   * 安排延迟执行任务
   * @param task 要执行的任务
   * @param delay 延迟时间
   * @param unit 时间单位
   * @return 定时任务控制器
   */
  public ScheduledFuture<?> schedule(Runnable task,
      long delay,
      TimeUnit unit) {
    return scheduler.schedule(task, delay, unit);
  }

  /**
   * 关闭定时任务管理器
   */
  public void shutdown() {
    scheduler.shutdown();
    try {
      if (!scheduler.awaitTermination(60, TimeUnit.SECONDS)) {
        scheduler.shutdownNow();
      }
    } catch (InterruptedException e) {
      scheduler.shutdownNow();
      Thread.currentThread().interrupt();
    }
  }
}